<?php

/*-----------------------------------------------------------*\
|                 - Парсинг шаблонів -                       |
|                 Author:  Skalden Russell                   |
|                 Last modify: 20130105                      |
\*-----------------------------------------------------------*/


// Захист скрипта від довільного запуску
if(!defined('TSUE_SEC')) {
	header('Content-Type: text/html; charset=utf-8');
	require_once( '../../data/messages/hacking.attempt.php' );
	die( $TSUE_MSG );
}



class CContent 
{
	var $hFile;
	var $sLang = array();
	
	////////////////////////////////
	// Інформація про замінних елементах 
	//  
	var $objRepl = array(array());

	// AntiRecursion
	var $antiClass; 
	var $PSEUDOVAR = array();
	
	var $pVarible;
	
	function CContent()
	{

	}
	
	function SetReplace( $Teg, $Text )
	{
		$this->objRepl[$Teg]['Repl_teg'] = $Teg;
		$this->objRepl[$Teg]['Repl_txt'] = $Text;
	}
	
	// Open file
	function openFile( $strPath, $sAtr )
	{
		$hF = fopen( $strPath, $sAtr );
		if( $hF )
		{
			return  $hF;
		}
		else
		{
			return false;
		}
	}
	
	// Close file
	function closeFile( $hFile )
	{
		fclose( $hFile );
	}
	
	// Read data from templates if sets $bites to 
	// 0 funtions read and return all file
	function readData( $bites, $hFile )
	{
		$strBuf = "";
		if( !$bites )
		{
			while( !feof( $hFile ) )
			{
				$strBuf .= fgets( $hFile, 4096 );
			}
		} 
		else
		{
			$strBuf = fread( $hFile, $bites );
		}

		if( $strBuf == "" )
		{
			return 0;
		}
		else
		{
			return $strBuf;
		}
	}
	
	function GetActElement( $act )
	{
		if($act === $this->objRepl[$act]['Repl_teg'])
		{
			return $this->objRepl[$act]['Repl_txt'];
		}

		$Res = new CRes();
		
		return $Res->get_element( $act );
	}
	
	// Parsing of single Elements
	function tParseContent( $sCont )
	{
		$commandInfo = array();
		$snumberInfo = array();
		$iIndex = 0;
		
		$sContent = explode("\n", $sCont);
		
		// Search E Tegs
		for( $i=0; $i<= count($sContent); $i++)
		{ 
			if(preg_match_all("/{_([A-Za-z0-9_]+)_}/i", $sContent[$i], $res ))
			{
				for($j=0; $j <= count($res[0])-1; $j++)
				{
					$commandInfo[$iIndex]['source'] = $res[0][$j];
					$commandInfo[$iIndex]['action'] = $res[1][$j];
					$snumerInfo[$iIndex] = $i;
					$iIndex++;
				}
			} 
		}	
		
		$iIndex--;
		
		for($i = 0; $i <= $iIndex; $i++)
		{
			if( $commandInfo[$i]['action'] === $this->antiClass )
			{
				echo"<h1><font color='#009900'>ANTICLASS ON</font></h1>";
			}
			else
			{
				$commandInfo[$i]['action'] = $this->GetActElement($commandInfo[$i]['action']);
			}
		}
		
			
		// Replace
		for( $i = 0; $i <= $iIndex; $i++)
		{	
			$sContent[$snumerInfo[$i]] = preg_replace("/([.]*)".$commandInfo[$i]['source']."([.]*)/", 
									"${1}".$commandInfo[$i]['action']."$2",
									 $sContent[$snumerInfo[$i]]);
		}
		
		return $sContent;
		
	}
	
	// Parse Login construction
	function tParseLogic( $sContent )
	{
	
		$iFlag = false;
		$iIndex = 0;
		$iVarInfo = array();
		for( $i = 0; $i < count($sContent); $i++ )
		{
			// Знаходимо блоки IF, END_IF
			if(preg_match("/<\!--(?:\s)*IF(?:\s)*([A-Za-z0-9]+)(?:\s)*-->/", $sContent[$i], $res ))
			{
				$iVarInfo[$iIndex]['start'] = $i;
				$iVarInfo[$iIndex]['VARIBLE'] = $res[1];
				for($j = $i+1; $j < count($sContent); $j++)
				{
					if(preg_match("/<\!--(?:\s)*END_IF(?:\s)*-->/", $sContent[$j], $res ))
					{
						$iVarInfo[$iIndex]['end'] = $j;
						$iIndex++;
						$iFlag = true;
						$i = $j;
						break;
					}
					
					// Знаходимо блоки ELSE_IF, END_ELSE_IF
					if(preg_match("/<\!--(?:\s)*ELSE_IF(?:\s)*-->/", $sContent[$j], $res ))
					{
						$iVarInfo[$iIndex]['end'] = $j;
						$iVarInfo[$iIndex]['else_start'] = $j;
						for($k = $j+1; $k < count($sContent); $k++)
						{
							if(preg_match("/<\!--(?:\s)*END_ELSE_IF(?:\s)*-->/", $sContent[$k], $res ))
							{
								$iFlag = true;
								$iVarInfo[$iIndex]['else_end'] = $k;
								$iIndex++;
								$i = $k;
								break;
							}
						}
					}
				}
			}
		}
		
		$sPreCont = array();

		if( $iFlag === true )
		{
			for( $iB = 0; $iB < $iIndex; $iB++ )
			{
				////////////////////////////////////////////////////////////////////////////
				//   Перевіряємо чи є межі, якщо вони не були знайдені для даного
				// елемента то ставить їх в мінус щоб уникнути перевірки кордонів в
				// умовних операторах
				if(($iVarInfo[$iB]['else_start'] === 0) && ($iVarInfo[$iB]['else_end'] === 0))
				{
					$iVarInfo[$iB]['else_start'] = -1;
					$iVarInfo[$iB]['else_end'] = -1;
				}
				if(($iVarInfo[$iB]['start'] === 0) && ($iVarInfo[$iB]['end'] === 0))
				{
					$iVarInfo[$iB]['start'] = -1;
					$iVarInfo[$iB]['end'] = -1;
				}
				
				$TPSEUDOVAR = $this->pVarible->get_session_var($iVarInfo[$iB]['VARIBLE']);
				if( $TPSEUDOVAR )
				{
					// Якщо змінна TRUE
					// Залишаємо блок IF і видаляємо блок ELSE якщо він є
					for( $i = 0, $k = 0; $i <= count($sContent); $i++)
					{
						if(($i >= $iVarInfo[$iB]['else_start']) && ($i <= $iVarInfo[$iB]['else_end'])
						|| ($i === $iVarInfo[$iB]['start']) || ($i === $iVarInfo[$iB]['end']))
						{
							$sPreCont[$k] = $sContent[$i];
						}
						else
						{
							$sPreCont[$k++] = $sContent[$i];
						}
					}
				}
				else
				{	
					// Якщо змінна FALSE 
					// Залишаемо блок ELSE і видаляємо блок IF
					for( $i = 0, $k = 0; $i <= count($sContent); $i++)
					{			
						if( ($i >= $iVarInfo[$iB]['start']) && ($i <= $iVarInfo[$iB]['end'])
						|| ($i === $iVarInfo[$iB]['else_start']) || ($i === $iVarInfo[$iB]['else_end']))
						{
							$sPreCont[$k] = $sContent[$i];
						}
						else
						{
							$sPreCont[$k++] = $sContent[$i];
						}
					}
			
				}
			}
			return $this->union( $sPreCont );
		}
		else
		{
			return $this->union( $sContent );
		}
	}
	
	// Include and union files
	function union( $asStr )
	{
		$strBuf = "";
		$iVarInfo = array();
		$iIndex = 0;
		
		for( $i = 0; $i < count($asStr); $i++ )
		{
			// Знаходимо блоки INCLUDE
			if(preg_match("/<\!--(?:\s)*include(?:\s)*\"([\D]+)\"(?:\s)*-->/i", $asStr[$i], $res ))
			{
				$hFile = $this->openFile( $res[1], "r" );
				if($hFile)
				{
					$strBuf .= $this->tParseLogic( $this->tParseContent ( $this->readData( 0, $hFile) ) );
				}
				else
				{
					echo"CContent \> Can`t include".$res[1]." <br />";
				}
			}
			else
			{
				$strBuf .= $asStr[$i];
			}	
		}
		
		return $strBuf;
	}
	
	// Function return content
	public function getContent( $sPath, $rMode )
	{
		$sBuf = "";
		$this->hFile = $this->openFile($sPath, $rMode);
		if( $this->hFile)
		{
			$sBuf = $this->tParseLogic( $this->tParseContent( $this->readData( 0, $this->hFile ) ) );
			$this->closeFile( $this->hFile );
		}
		else
		{
			echo"CContent \> Can`t open file: $sPath <br />";
		}
		
		return 	$sBuf;
	}
}

?>